// 第一版 (来自《JavaScript权威指南》)
function memorize(f) {
    var cache = {};// 把参数和对应的结果数据缓存到闭包中
    return function(){
        //让参数长度与参数拼接成字符串，例如1,2 -> 21,2,形成唯一的key值
        var key = arguments.length + Array.prototype.join.call(arguments, ",");
        // console.log(key);
        if (key in cache) {// 如果key存在就返回
            return cache[key]
        }// 否则执行原来的函数并保存结果
        else return cache[key] = f.apply(this, arguments)
    }
}
var add = function(a, b, c) {
    return a + b + c
  }
  
  var memoizedAdd = memorize(add)
  
  console.time('use memorize')
  for(var i = 0; i < 100000; i++) {
      memoizedAdd(1, 2, 3)
  }
  console.timeEnd('use memorize')
  
  console.time('not use memorize')
  for(var i = 0; i < 100000; i++) {
      add(1, 2, 3)
  }
  console.timeEnd('not use memorize')